package com.xie.leetcode.string;

//564. 寻找最近的回文数
//        给定一个表示整数的字符串 n ，返回与它最近的回文整数（不包括自身）。如果不止一个，返回较小的那个。
//
//        “最近的”定义为两个整数差的绝对值最小。
//
//        示例 1:
//
//        输入: n = "123"
//        输出: "121"
//        示例 2:
//
//        输入: n = "1"
//        输出: "0"
//        解释: 0 和 2是最近的回文，但我们返回最小的，也就是 0。
//
//        提示:
//
//        1 <= n.length <= 18
//        n 只由数字组成
//        n 不含前导 0
//        n 代表在 [1, 10^18 - 1] 范围内的整数

/**
 * @author xiezhendong
 * @date 2022/3/2
 */
public class NearestPalindromic {

    public static void main(String[] args) {
        NearestPalindromic nearestPalindromic = new NearestPalindromic();
        System.out.println(nearestPalindromic.nearestPalindromic("1234"));
        System.out.println(nearestPalindromic.nearestPalindromic("123"));
        System.out.println(nearestPalindromic.nearestPalindromic("1"));
        System.out.println(nearestPalindromic.nearestPalindromic("7"));
        System.out.println(nearestPalindromic.nearestPalindromic("10"));
        System.out.println(nearestPalindromic.nearestPalindromic("100"));
        System.out.println(nearestPalindromic.nearestPalindromic("9"));
        System.out.println(nearestPalindromic.nearestPalindromic("99"));
        System.out.println(nearestPalindromic.nearestPalindromic("999"));
        System.out.println(nearestPalindromic.nearestPalindromic("11"));
        System.out.println(nearestPalindromic.nearestPalindromic("101"));
        System.out.println(nearestPalindromic.nearestPalindromic("1001"));
    }

    public String nearestPalindromic(String n) {
        // < 10，返回自身 - 1
        if (n.length() == 1) {
            return String.valueOf(Integer.parseInt(n) - 1);
        }
        long m = Long.parseLong(n);
        // 10,100...10000，返回自身 - 1
        if (isHw(String.valueOf(m - 1))) {
            return String.valueOf(m - 1);
        }
        // 9,99...9999，返回自身 + 2
        if (isHw(String.valueOf(m + 2))) {
            return String.valueOf(m + 2);
        }
        // 11,101...10001，返回自身 -2
        if (isHw(String.valueOf(m - 2))) {
            return String.valueOf(m - 2);
        }
        // 长度为偶数
        if (n.length() % 2 == 0) {
            long self = Long.parseLong(n.substring(0, n.length() / 2));

        }
        // 长度为奇数
        else {
            long self = Long.parseLong(n.substring(0, (n.length()+1) / 2));
            System.out.println(self);
        }

        return n;
    }

    private boolean isHw(String s) {
        int len = s.length();
        if (len == 1 && Integer.parseInt(s) <= 9) {
            return true;
        }
        int i = 0;
        int j = len - 1;
        while (i < j) {
            if (s.getBytes()[i] != s.getBytes()[j]) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }

}
